package com.warthur.spring.shiro.common.util;

import lombok.extern.log4j.Log4j;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Set;

/**
 * @author warthur
 * @date 2018/09/09
 */
@Log4j
public class JedisUtils {

    private static JedisPool jedisPool;
    private static int expireTime = 1800;

    static {
        initPool();
    }

    /**
     * 初始化连接池
     */
    public static void initPool(){
        JedisPoolConfig config = new JedisPoolConfig();
        int maxActive = 200;
        config.setMaxTotal(maxActive);
        int maxIdle = 200;
        config.setMaxIdle(maxIdle);
        long maxWait = 5000;
        config.setMaxWaitMillis(maxWait);
        config.setTestOnBorrow(false);

        String redisIp = "47.98.157.127";
        String password = "1qaz@WSX3edc";
        int redisPort = 6379;
        int db = 1;
        jedisPool = new JedisPool(config, redisIp, redisPort, 10000, password, db);
    }

    /**
     * 从连接池获取redis连接
     * @return jedis
     */
    public static Jedis getJedis(){
        Jedis jedis = null;
        try{
            jedis = jedisPool.getResource();
        } catch(Exception e){
            log.error(e);
        }

        return jedis;
    }

    /**
     * 回收redis连接
     * @param jedis jedis
     */
    public static void close(Jedis jedis){
        if(jedis != null){
            try{
                jedis.close();
            } catch(Exception e){
                log.error(e);
            }
        }
    }

    /**
     * 保存字符串数据
     * @param key key
     * @param value value
     */
    public static void set(String key, String value){
        Jedis jedis = getJedis();
        if(jedis != null){
            try{
                jedis.set(key, value);
            } catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }

    }

    /**
     * 保存字符串数据
     * @param key key
     * @param value value
     * @param expire seconds
     */
    public static void set(String key, String value, int expire){
        Jedis jedis = getJedis();
        if(jedis != null){
            try{
                jedis.setex(key, expire, value);
            } catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }

    }

    /**
     * 获取字符串类型的数据
     * @param key key
     * @return string
     */
    public static String get(String key){
        Jedis jedis = getJedis();
        String result = "";
        if(jedis != null){
            try{
                result = jedis.get(key);
            }catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }

        return result;
    }

    /**
     * 删除字符串数据
     * @param key key
     */
    public static void delete(String key){
        Jedis jedis = getJedis();
        if(jedis != null){
            try{
                jedis.del(key);
            }catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }
    }

    /**
     * 保存byte类型数据
     * @param key key
     * @param value value
     */
    public static void set(byte[] key, byte[] value){
        Jedis jedis = getJedis();
        String result = "";
        if(jedis != null){
            try{
                if(!jedis.exists(key)){
                    jedis.set(key, value);
                }
                // redis中session过期时间
                jedis.expire(key, expireTime);
            } catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }
    }

    /**
     * 获取byte类型数据
     * @param key key
     * @return byte array
     */
    public static byte[] get(byte[] key){
        Jedis jedis = getJedis();
        byte[] bytes = null;
        if(jedis != null){
            try{
                bytes = jedis.get(key);;
            }catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }
        return bytes;

    }

    /**
     * 更新byte类型的数据，主要更新过期时间
     * @param key key
     */
    public static void update(byte[] key){
        Jedis jedis = getJedis();
        if(jedis != null){
            try{
                // redis中session过期时间
                jedis.expire(key, expireTime);
            }catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }

    }

    /**
     * key对应的整数value加1
     * @param key key
     */
    public static void incr(String key){
        Jedis jedis = getJedis();
        if(jedis != null){
            try{
                if(!jedis.exists(key)){
                    jedis.set(key, "1");
                    int countExpireTime = 2 * 24 * 3600;
                    jedis.expire(key, countExpireTime);
                } else {
                    // 加1
                    jedis.incr(key);
                }
            }catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }
    }

    /**
     * 获取所有keys
     * @param pattern 正则匹配
     * @return set
     */
    public static Set<String> getAll(String pattern){
        Jedis jedis = getJedis();
        if(jedis != null){
            try{
                return jedis.keys(pattern);
            }catch(Exception e){
                log.error(e);
            } finally{
                close(jedis);
            }
        }
        return null;
    }
}
